#pragma once
#include "util/Byteable.h"

namespace yzrilyzr_net{
	ECLASS(IPAddress,public yzrilyzr_util::Byteable){
	protected:
	int32_t maskLength=0;
	public:
	IPAddress()=default;
	IPAddress(const yzrilyzr_array::ByteArray& fromBytes);
	~IPAddress()=default;
	virtual bool inRange(const IPAddress *targetRange)const=0;
	virtual yzrilyzr_lang::String toFullString()const=0;
	virtual yzrilyzr_lang::String toMaskedString()const=0;
	virtual yzrilyzr_lang::String toSimpleString()const=0;
	int32_t getMaskLength()const{
		return maskLength;
	}
	virtual std::shared_ptr<IPAddress> toMasked(int32_t maskLength)const=0;
	virtual std::shared_ptr<IPAddress> clone()const=0;
	yzrilyzr_lang::String toString()const override{
		return toSimpleString();
	}
	static std::shared_ptr<IPAddress> parse(const yzrilyzr_lang::String & str);
	static bool isIPV4(const IPAddress *addr);
	static bool isIPV6(const IPAddress *addr);
	virtual int getVersion()const=0;
	};
}